package com.efast.dmom.mgmt.controller.les;

import java.util.Date;
import java.util.List;
import java.util.Map;
import com.efast.cafe.framework.bean.ResultBean;
import com.efast.cafe.framework.util.SpringWebUtils;
import com.efast.dmom.mgmt.entity.les.TmMmDeliverySheet;
import com.efast.dmom.mgmt.entity.les.TmMmDeliverySheetOp;
import com.efast.dmom.mgmt.entity.les.TmMmDeliverySheetPart;
import com.efast.dmom.mgmt.entity.les.TwDocOrderDetails;
import com.efast.dmom.mgmt.entity.les.TwDocOrderHeader;
import com.efast.dmom.mgmt.service.les.TmMmDeliverySheetOpService;
import com.efast.dmom.mgmt.service.les.TmMmDeliverySheetPartService;
import com.efast.dmom.mgmt.service.les.TmMmDeliverySheetService;
import com.efast.dmom.mgmt.service.les.TwDocOrderDetailsService;
import com.efast.dmom.mgmt.service.les.TwDocOrderHeaderService;
import com.efast.dmom.mgmt.utils.Assist;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

/**
 * 
 * @ClassName: MaterialLineController
 * @Description: 物料上线 -- Material line 涉及数据表：看板上线单头表 tm_mm_delivery_sheet
 *               看板上线单明细tm_mm_delivery_sheet_part
 * @author ChenLiPeng
 * @date 2018年3月28日
 *
 */
@Controller
@RequestMapping(value = "/materialLine")
@Api(value = "/ttMmManualMri", description = "物料上线")
public class MaterialLineController {

	@Autowired
	private TmMmDeliverySheetService tmMmDeliverySheetService;

	@Autowired
	private TmMmDeliverySheetPartService tmMmDeliverySheetPartService;

	@Autowired
	private TmMmDeliverySheetOpService tmMmDeliverySheetOpService;

	// 出库订单表 header tw_doc_order_header
	@Autowired
	private TwDocOrderHeaderService twDocOrderHeaderService;

	// 出库订单表 detail tw_doc_order_details
	@Autowired
	private TwDocOrderDetailsService twDocOrderDetailsService;

	/**
	 * @Title: queryInfoByPullNo
	 * @Description: 对物料上线提供【上线】 点击“上线”这个按钮，即代表“线边已接收”，但是需要判断该条记录是否已经 出库
	 * @param {"sheetNo":"XXX"}
	 * @return ResultBean
	 */
	@ApiOperation(value = "对物料上线提供【上线】", httpMethod = "POST", notes = "该接口前台需要传递的数据格式：{\"sheetNo\":\"XXX\"}")
	@RequestMapping(value = "/line", method = RequestMethod.POST)
	public @ResponseBody ResultBean line(@RequestBody Map<String, Object> map) {
		ResultBean result = new ResultBean(true, "'");
		// 【1】 : 通过sheet_no查询出唯一的一条记录
		Assist assist = new Assist(Assist.andEq("tm_mm_delivery_sheet.sheet_no", (String) map.get("sheetNo")));
		List<TmMmDeliverySheet> listHeader = tmMmDeliverySheetService.selectTmMmDeliverySheet(assist);

		// 【2】：查询出sheet_no所对应的detail
		List<TmMmDeliverySheetPart> listTmMmDeliverySheetPart = tmMmDeliverySheetPartService
				.selectTmMmDeliverySheetPart(
						new Assist(Assist.andEq("tm_mm_delivery_sheet_part.tm_mm_delivery_sheet_id",
								listHeader.get(0).getTmMmDeliverySheetId())));
		boolean ifSendSuccess = false;
		for (TmMmDeliverySheetPart tmMmDeliverySheetPart : listTmMmDeliverySheetPart) {
			// 【3】：根据tm_mm_delivery_sheet_part.tm_mm_delivery_sheet_part_id =
			// tw_doc_order_details.cust_sheet_line_id
			// tm_mm_delivery_sheet_part.cust_sheet_id = tm_mm_delivery_sheet.sheet_no
			// 次记录关联依据是在“组单”（TtMmManualMriServiceImpl）的时候，关联插入的。
			List<TwDocOrderDetails> listTwDocOrderDetails = twDocOrderDetailsService.selectTwDocOrderDetails(new Assist(
					Assist.andEq("tw_doc_order_details.cust_sheet_id",
							listHeader.get(0).getSheetNo()),
					Assist.andEq("tw_doc_order_details.cust_sheet_line_id", tmMmDeliverySheetPart.getTmMmDeliverySheetPartId())));
			
			// 状态（发运任务未产生0、发运任务产生1、部分发运2、发运完成3）
			TmMmDeliverySheetPart tmMmDeliverySheetPart1 = tmMmDeliverySheetPartService
					.selectTmMmDeliverySheetPartById(listTwDocOrderDetails.get(0).getCustSheetLineId());
			if ((listTwDocOrderDetails.get(0).getItemLoadStatus()).equals("3")) {
				// 需求单状态（0新单 1已发布 2线边已接收-未出库 3线边已接收-已出库 4线边已拒收）
				tmMmDeliverySheetPart1.setItemStatus("3");
			} else {
				// 说明出库单有明细没有出库的
				ifSendSuccess = true;
				tmMmDeliverySheetPart1.setItemStatus("2");
			}
			// 除了修改状态之外，还需要修改 对应实际的 线旁已收货数量 和 线旁已收货箱数
			tmMmDeliverySheetPart1.setLineReceiveQty(tmMmDeliverySheetPart1.getReqQty());
			tmMmDeliverySheetPart1.setLineReceiveBoxnum(tmMmDeliverySheetPart1.getReqBoxnum());
			tmMmDeliverySheetPartService.updateNonEmptyTmMmDeliverySheetPartById(tmMmDeliverySheetPart1);
		}

		// 【4】：更新 看板上线单头表 tm_mm_delivery_sheet
		TmMmDeliverySheet tmMmDeliverySheet = new TmMmDeliverySheet();
		tmMmDeliverySheet.setTmMmDeliverySheetId(listHeader.get(0).getTmMmDeliverySheetId());
		if (ifSendSuccess) {
			tmMmDeliverySheet.setSheetStatus("2"); // 需求单状态（0新单 1已发布 2线边已接收-未出库 3线边已接收-已出库 4线边已拒收）
		} else {
			tmMmDeliverySheet.setSheetStatus("3"); // 需求单状态（0新单 1已发布 2线边已接收-未出库 3线边已接收-已出库 4线边已拒收）
		}
		tmMmDeliverySheetService.updateNonEmptyTmMmDeliverySheetById(tmMmDeliverySheet);

		// 【5】 看板上线单历史记录 tm_mm_delivery_sheet_op
		TmMmDeliverySheetOp tmMmDeliverySheetOp = new TmMmDeliverySheetOp();
		tmMmDeliverySheetOp.setTmMmDeliverySheetId(listHeader.get(0).getTmMmDeliverySheetId());
		tmMmDeliverySheetOp.setCreateTime(new Date());
		tmMmDeliverySheetOp.setCompanyCode(SpringWebUtils.getRequestCompany());
		tmMmDeliverySheetOp.setCreateUser(SpringWebUtils.getRequestUser());
		if (ifSendSuccess) {
			tmMmDeliverySheetOp.setOperateNotes("线边已接收-未出库");// 操作备注
			tmMmDeliverySheetOp.setCommonSheetOpType("2");// 需求单状态（0新单 1已发布 2线边已接收-未出库 3线边已接收-已出库 4线边已拒收）
		} else {
			tmMmDeliverySheetOp.setOperateNotes("线边已接收-已出库");// 操作备注
			tmMmDeliverySheetOp.setCommonSheetOpType("3");// 需求单状态（0新单 1已发布 2线边已接收-未出库 3线边已接收-已出库 4线边已拒收）
		}
		tmMmDeliverySheetOp.setOperateUsername(SpringWebUtils.getRequestUser());
		tmMmDeliverySheetOp.setMarkStatus(1);
		tmMmDeliverySheetOpService.insertNonEmptyTmMmDeliverySheetOp(tmMmDeliverySheetOp);

		result.setMessage("上线成功");
		return result;
	}

	/**
	 * @Title: deleteLine
	 * @Description: 【拒绝上线】-- refuse line
	 * @param {"sheetNo":"XXX"}
	 * @return ResultBean 返回类型
	 */
	@ApiOperation(value = "【拒绝上线】", httpMethod = "POST", notes = "该接口前台需要传递的数据格式：{\"sheetNo\":\"XXX\"}")
	@RequestMapping(value = "/refuseLine", method = RequestMethod.POST)
	public @ResponseBody ResultBean refuseLine(@RequestBody Map<String, String> map) {
		ResultBean result = new ResultBean(true, "'");

		// 【1】 : 通过sheet_no查询出唯一的一条记录
		Assist assist = new Assist(Assist.andEq("tm_mm_delivery_sheet.sheet_no", map.get("sheetNo")));
		List<TmMmDeliverySheet> listHeader = tmMmDeliverySheetService.selectTmMmDeliverySheet(assist);

		List<TwDocOrderHeader> listTwDocOrderHeader = twDocOrderHeaderService.selectTwDocOrderHeader(new Assist(
				Assist.andEq("tw_doc_order_header.cust_sheet_id", listHeader.get(0).getSheetNo())));
		String soSheetStatus = listTwDocOrderHeader.get(0).getSoSheetStatus();
		// 【2】判断是否出库 【没有出库】如果还没有出库，那么取消出库，关闭订单
		if (!(soSheetStatus.equals("8") || soSheetStatus.equals("7"))) {
			TwDocOrderHeader twDocOrderHeader = new TwDocOrderHeader();
			twDocOrderHeader.setTwDocOrderHeaderId(listTwDocOrderHeader.get(0).getTwDocOrderHeaderId());
			// SO单证状态（新单0、部分分配1、分配完成2、部分拣货3、拣货完成4、部分装箱5、装箱完成6、部分发运7、发运完成8、订单取消9、单证关闭10）
			twDocOrderHeader.setSoSheetStatus("10");
			twDocOrderHeaderService.updateNonEmptyTwDocOrderHeaderById(twDocOrderHeader);
		} else {
			// 【已经出库】 实物返还库位，系统已出库的情况下，做库存调整补回库存
			// 暂时不做..
		}

		// 【3】：更新 看板上线单头表 tm_mm_delivery_sheet
		TmMmDeliverySheet tmMmDeliverySheet = new TmMmDeliverySheet();
		tmMmDeliverySheet.setTmMmDeliverySheetId(listHeader.get(0).getTmMmDeliverySheetId());
		tmMmDeliverySheet.setMarkStatus(4);// 需求单状态（0新单 1发布 2部分上线 3上线完成 4上线失败）
		tmMmDeliverySheetService.updateNonEmptyTmMmDeliverySheetById(tmMmDeliverySheet);

		// 【4】：更新 看板上线单明细 tm_mm_delivery_sheet_part
		Assist assist1 = new Assist(Assist.andEq("tm_mm_delivery_sheet_part.tm_mm_delivery_sheet_id",
				listHeader.get(0).getTmMmDeliverySheetId()));
		TmMmDeliverySheetPart tmMmDeliverySheetPart1 = new TmMmDeliverySheetPart();
		tmMmDeliverySheetPart1.setItemStatus("4"); // 需求单状态（0新单 1已发布 2线边已接收-未出库 3线边已接收-已出库 4线边已拒收）
		tmMmDeliverySheetPartService.updateNonEmptyTmMmDeliverySheetPart(tmMmDeliverySheetPart1, assist1);

		// 【5】 看板上线单历史记录 tm_mm_delivery_sheet_op
		TmMmDeliverySheetOp tmMmDeliverySheetOp = new TmMmDeliverySheetOp();
		tmMmDeliverySheetOp.setTmMmDeliverySheetId(listHeader.get(0).getTmMmDeliverySheetId());
		tmMmDeliverySheetOp.setCreateTime(new Date());
		tmMmDeliverySheetOp.setCompanyCode(SpringWebUtils.getRequestCompany());
		tmMmDeliverySheetOp.setCreateUser(SpringWebUtils.getRequestUser());
		tmMmDeliverySheetOp.setOperateNotes("线边已拒收");// 操作备注
		tmMmDeliverySheetOp.setCommonSheetOpType("4");// 需求单状态（0新单 1已发布 2线边已接收-未出库 3线边已接收-已出库 4线边已拒收）
		tmMmDeliverySheetOp.setOperateUsername(SpringWebUtils.getRequestUser());
		tmMmDeliverySheetOp.setMarkStatus(1);
		tmMmDeliverySheetOpService.insertNonEmptyTmMmDeliverySheetOp(tmMmDeliverySheetOp);

		result.setMessage("拒绝上线成功");
		return result;
	}

	
	@ApiOperation(value = "【操作历史记录查询】", httpMethod = "POST", notes = "该接口前台需要传递的数据格式：{\"sheetNo\":\"XXX\"}")
	@ResponseBody
	@RequestMapping(value = "/queryHis", method = RequestMethod.POST)
	public ResultBean queryHis(@RequestBody Map<String, Object> map) {
		ResultBean result = new ResultBean(true,"");
		Assist assist = new Assist(Assist.andEq("tm_mm_delivery_sheet.sheet_no", map.get("sheetNo")));
		assist.setResultColumn("tm_mm_delivery_sheet_id");
		List<TmMmDeliverySheet> listTmMmDeliverySheet = tmMmDeliverySheetService.selectTmMmDeliverySheet(assist);

		Assist assist1 = new Assist(Assist.andEq("tm_mm_delivery_sheet_op.tm_mm_delivery_sheet_id",
				listTmMmDeliverySheet.get(0).getTmMmDeliverySheetId()));
		List<TmMmDeliverySheetOp> listTmMmDeliverySheetOp = tmMmDeliverySheetOpService
				.selectTmMmDeliverySheetOp(assist1);
		
		result.setObject(listTmMmDeliverySheetOp);
		return result;
	}

}
